package demo;

import java.util.Arrays;

/**
 * 手撕ArrayList,仿写ArrayList
 * 仿写的API要与原版ArrayList功能一致
 * */
public class MyArrayList<E> {
    private Object[] elementData = new Object[0];
    private int size = 0;

    /**
     * 将数据追加到集合中
     */
    public boolean add(E e){

        //先确认容量, 再添加元素
        ensureCapacity();
//        //第一次添加元素, 创建一个10元素的对象数组
//        if (size==0){
//            elementData = new Object[10];
//        }
//        //但数组满了的时候, 需要扩容1.5倍
//        if (size==elementData.length){//数组满了
//            //扩容 新数组=Arrays.copyof(原数组,新容量) Capacity:容量
//            int oldCapacity = elementData.length;
//            int newCapacity = oldCapacity+(oldCapacity>>1);
//            //扩容">>"往左移动给一位则是缩小一倍
//            elementData = Arrays.copyOf(elementData,newCapacity);
//            System.out.println("新容量:"+newCapacity);
//
//        }
        elementData[size++]=e;
        return true;
    }

    /**
     * ensure 确保/确认
     * Capacity 容量
     * */
    private void ensureCapacity(){
        if (size==0){
            elementData = new Object[10];
        }
        if (size==elementData.length){//数组满了
            //扩容 新数组=Arrays.copyof(原数组,新容量) Capacity:容量
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity+(oldCapacity>>1);
            //扩容">>"往左移动给一位则是缩小一倍
            elementData = Arrays.copyOf(elementData,newCapacity);
            System.out.println("新容量:"+newCapacity);

        }
    }

    /**
     * 插入方法
     * 将元素插入到指定位置,原有数据将向后移动
     * */
    public void add(int index,E e){
        if (index<0||index>size){
            throw new IndexOutOfBoundsException("越界:"+index);
        }
        if (index == size){//在尾部追加
            add(e);
            return;
        }
        //先确认容量,如果不确认容量的话就会报出下标越界
        ensureCapacity();
        //移动元素
        for(int i=size-1;i>=index;i--){
            elementData[i+1] = elementData[i];
        }
        //插入元素
        elementData[index] = e;
        size++;
    }

    public E get(int index){
        return (E)elementData[index];
    }

    public int size(){
        return size;
    }


}
